package br.fafica.poo2.rightcode.fachada;

import java.sql.SQLException;
import java.util.ArrayList;

import br.fafica.poo2.rightcode.aluno.Aluno;
import br.fafica.poo2.rightcode.aluno.ControladorAluno;
import br.fafica.poo2.rightcode.aluno.IRepositorioAluno;
import br.fafica.poo2.rightcode.aluno.RepositorioAlunoArrayList;
import br.fafica.poo2.rightcode.aluno.RepositorioAlunoOracle;
import br.fafica.poo2.rightcode.disciplina.ControladorDisciplina;
import br.fafica.poo2.rightcode.disciplina.Disciplina;
import br.fafica.poo2.rightcode.disciplina.IRepositorioDisciplina;
import br.fafica.poo2.rightcode.disciplina.RepositorioDisciplinaArrayList;
import br.fafica.poo2.rightcode.disciplina.RepositorioDisciplinaOracle;
import br.fafica.poo2.rightcode.exception.AlunoNaoEncontradoException;
import br.fafica.poo2.rightcode.exception.CnpjInvalidoException;
import br.fafica.poo2.rightcode.exception.CodigoInvalidoException;
import br.fafica.poo2.rightcode.exception.DisciplinaNaoEncontradaException;
import br.fafica.poo2.rightcode.exception.FiltroNaoEncontradoException;
import br.fafica.poo2.rightcode.exception.InstituicaoNaoEncontradaException;
import br.fafica.poo2.rightcode.exception.ListaDisciplinaVaziaException;
import br.fafica.poo2.rightcode.exception.ListaInstituicaoVaziaException;
import br.fafica.poo2.rightcode.exception.NomeInvalidoException;
import br.fafica.poo2.rightcode.exception.UsuarioNaoEncontradoException;
import br.fafica.poo2.rightcode.exception.listaAlunoVaziaException;
import br.fafica.poo2.rightcode.exception.listaFiltroVaziaException;
import br.fafica.poo2.rightcode.exception.listaUsuarioVaziaException;
import br.fafica.poo2.rightcode.factory.ConnectionFactoryOracle;
import br.fafica.poo2.rightcode.factory.DataSourceType;
import br.fafica.poo2.rightcode.filtro.ControladorFiltro;
import br.fafica.poo2.rightcode.filtro.Filtro;
import br.fafica.poo2.rightcode.filtro.IRepositorioFiltro;
import br.fafica.poo2.rightcode.filtro.RepositorioFiltroArrayList;
import br.fafica.poo2.rightcode.filtro.RepositorioFiltroOracle;
import br.fafica.poo2.rightcode.instituicao.ControladorInstituicao;
import br.fafica.poo2.rightcode.instituicao.Instituicao;
import br.fafica.poo2.rightcode.usuario.ControladorUsuario;
import br.fafica.poo2.rightcode.usuario.IRepositorioUsuario;
import br.fafica.poo2.rightcode.usuario.RepositorioUsuarioArrayList;
import br.fafica.poo2.rightcode.usuario.RepositorioUsuarioOracle;
import br.fafica.poo2.rightcode.usuario.Usuario;

public class Fachada implements IFachada{
		
	//private static final String controladorFiltro = null;
	private static Fachada instancia;
	private ControladorFiltro controleFiltro;
	private ControladorUsuario controleUsuario;
	private ControladorDisciplina controleDisciplina;
	private ControladorAluno controleAluno;
	private ControladorInstituicao controleInstituicao;
	private Fachada(){
		controleUsuario = new ControladorUsuario();
		controleDisciplina = new ControladorDisciplina();
		controleFiltro = new ControladorFiltro();
		controleAluno = new ControladorAluno();
		controleInstituicao = new ControladorInstituicao();
	}
	
	public static Fachada getInstancia(){
		if(instancia == null) instancia = new Fachada();
		return instancia;
	}
	
	
	@Override
	public void selectDataSource(DataSourceType type) {
		controleUsuario.selectDataSourceUsuario(type);
		controleDisciplina.selectDataSourceDisciplina(type);
		controleFiltro.selectDataSourceFiltro(type);
		controleAluno.selectDataSourceAluno(type);
		controleInstituicao.selectDataSourceInstituicao(type);
		
	}
	
	public void installDataSource(boolean samples) throws SQLException{
		this.controleUsuario.InstalarUsuario(samples);
		this.controleDisciplina.InstalarDisciplina(samples);
		this.controleFiltro.InstalarFiltro(samples);
		this.controleAluno.InstalarAluno(samples);
	}
	

	@Override
	public void TesteAluno() throws SQLException {
		this.controleAluno.TesteAluno();
		
	}

	@Override
	public void InstalarAluno(boolean samples) throws SQLException {
		this.controleAluno.InstalarAluno(samples);
	}

	@Override
	public void AdicionarAluno(Aluno aluno) throws SQLException, CodigoInvalidoException, NomeInvalidoException {
		this.controleAluno.AdicionarAluno(aluno);
		
	}

	@Override
	public ArrayList<Aluno> ListaAluno() throws listaAlunoVaziaException, SQLException {
		return this.controleAluno.ListaAluno();
	}

	@Override
	public void RemoverAluno(Aluno aluno) throws SQLException, AlunoNaoEncontradoException, CodigoInvalidoException {
		this.controleAluno.RemoverAluno(aluno);
	}

	@Override
	public Aluno BuscarAluno(int codigo) throws AlunoNaoEncontradoException, SQLException, CodigoInvalidoException {
		return this.controleAluno.BuscarAluno(codigo);
	}

	@Override
	public void EditarAluno(Aluno aluno) throws AlunoNaoEncontradoException, SQLException, CodigoInvalidoException {
		this.controleAluno.RemoverAluno(aluno);
	}

	@Override
	public void TesteFiltro() throws SQLException {
		this.controleFiltro.TesteFiltro();
	}

	@Override
	public void InstalarFiltro(boolean samples) throws SQLException {
		this.controleFiltro.InstalarFiltro(samples);
		
	}

	@Override
	public void AdicionarFiltro(Filtro filtro) throws SQLException, CodigoInvalidoException, NomeInvalidoException {
		this.controleFiltro.AdicionarFiltro(filtro);
		
	}

	@Override
	public ArrayList<Filtro> ListaFiltro() throws SQLException, listaFiltroVaziaException {
		return this.controleFiltro.ListaFiltro();
	}

	@Override
	public void RemoverFiltro(Filtro filtro) throws SQLException, FiltroNaoEncontradoException, CodigoInvalidoException {
		this.controleFiltro.RemoverFiltro(filtro);
		
	}

	@Override
	public Filtro BuscarFiltro(int codigo) throws SQLException, FiltroNaoEncontradoException, CodigoInvalidoException {
		return this.controleFiltro.BuscarFiltro(codigo);
	}

	@Override
	public void EditarFiltro(Filtro filtro) throws FiltroNaoEncontradoException, SQLException, NomeInvalidoException, CodigoInvalidoException {
		this.controleFiltro.EditarFiltro(filtro);
		
	}

	@Override
	public void TesteUsuario() throws SQLException{
		this.controleUsuario.TesteUsuario();
	}

	@Override
	public void InstalarUsuario(boolean samples) throws SQLException {
		this.controleUsuario.InstalarUsuario(samples);
	}

	@Override
	public void AdicionarUsuario(Usuario usuario) throws SQLException, CodigoInvalidoException, NomeInvalidoException {
		this.controleUsuario.AdicionarUsuario(usuario);
		
	}

	@Override
	public ArrayList<Usuario> ListaUsuario() throws SQLException, listaUsuarioVaziaException {
		return this.controleUsuario.ListaUsuario();
	}

	@Override
	public void RemoverUsuario(Usuario usuario) throws SQLException, UsuarioNaoEncontradoException, CodigoInvalidoException {
		this.controleUsuario.RemoverUsuario(usuario);
		
	}

	@Override
	public Usuario BuscarUsuario(int codigo) throws SQLException, UsuarioNaoEncontradoException, CodigoInvalidoException {
		return this.controleUsuario.BuscarUsuario(codigo);
	}

	@Override
	public void EditarUsuario(Usuario usuario)throws SQLException, UsuarioNaoEncontradoException, NomeInvalidoException, CodigoInvalidoException {
		this.controleUsuario.EditarUsuario(usuario);
	}

	@Override
	public void TesteDisciplina() throws SQLException {
		this.controleDisciplina.TesteDisciplina();
	}

	@Override
	public void InstalarDisciplina(boolean samples) throws SQLException {
		this.controleDisciplina.InstalarDisciplina(samples);
		
	}

	@Override
	public void AdicionarDisciplina(Disciplina disciplina) throws SQLException, CodigoInvalidoException, NomeInvalidoException {
		this.controleDisciplina.AdicionarDisciplina(disciplina);
		
	}

	@Override
	public void RemoverDisciplina(Disciplina disciplina) throws SQLException, DisciplinaNaoEncontradaException, CodigoInvalidoException {
		this.controleDisciplina.RemoverDisciplina(disciplina);
		
	}

	@Override
	public Disciplina BuscarDisciplina(int codigo) throws SQLException, DisciplinaNaoEncontradaException, CodigoInvalidoException {
		return this.controleDisciplina.BuscarDisciplina(codigo);
	}

	@Override
	public ArrayList<Disciplina> ListaDisciplina() throws ListaDisciplinaVaziaException, SQLException {
		return this.controleDisciplina.ListaDisciplina();
	}

	@Override
	public void EditarDisciplinas(Disciplina disciplina)
			throws DisciplinaNaoEncontradaException, SQLException, NomeInvalidoException, CodigoInvalidoException {
		this.controleDisciplina.EditarDisciplina(disciplina);
		
	}

	@Override
	public void TesteInstituicao() throws SQLException {
		this.controleInstituicao.TesteInstituicao();
		
	}

	@Override
	public void InstalarInstituicao(boolean samples) throws SQLException {
		this.controleInstituicao.InstalarInstituicao(samples);
		
	}

	@Override
	public void AdicionarInstituicao(Instituicao instituicao) throws SQLException,NomeInvalidoException,CnpjInvalidoException {
				this.controleInstituicao.AdicionarInstituicao(instituicao);
		
	}

	@Override
	public void RemoverInstituicao(Instituicao instituicao) throws SQLException,CnpjInvalidoException, InstituicaoNaoEncontradaException {
		this.controleInstituicao.RemoverInstituicao(instituicao);
		
	}

	@Override
	public ArrayList<Instituicao> ListaInstituicao() throws SQLException, ListaInstituicaoVaziaException {
		return this.controleInstituicao.ListaInstituicao();
		
	}

	@Override
	public Instituicao BuscarInstituicao(int cnpj) throws SQLException, InstituicaoNaoEncontradaException, CnpjInvalidoException {
		return this.controleInstituicao.BuscarInstituicao(cnpj);
		
	}

	@Override
	public void EditarInstituicao(Instituicao instituicao) throws SQLException, InstituicaoNaoEncontradaException, NomeInvalidoException, CnpjInvalidoException {
		this.controleInstituicao.EditarInstituicao(instituicao);
		
	}
	
}
